/*
* Project: My code
* Module: module_name
* File: util.c
* Created Date: 2024-05-24 18:10:20
* Author: your name
* Description: description
*
*历史记录：
*
* Copyright (c) 2024 - vDiscovery, Inc
*/


/* ======================================================================================
* includes
* 添加头文件位置
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <dirent.h>
#include <sys/stat.h>

#include "core.h"
#include "log.h"

/* ======================================================================================
* macros
* 宏定义位置
*/


/* ======================================================================================
* log
* log标志位置
*/


/* ======================================================================================
* extern
* 外部定义变量或函数位置
*/


/* ======================================================================================
* declaration
* 函数声明位置
*/


/* ======================================================================================
* types
* 类型定义位置
*/


/* ======================================================================================
* globals
* 全局变量位置
*/


/* ======================================================================================
* private implementation
* 本模块私有函数位置
*/
static int _suffix_valid_check(char *str)
{
    char *file_suffix = NULL;

    if( strlen(str) > MAX_FILE_SUFFIX_LEN - 1)
    {
        log_error("文件后缀超长 限制%d个字符  现在%ld个字符\n",MAX_FILE_SUFFIX_LEN - 1,strlen(str));
        return -1;
    }

    if( strlen(str) > 1 )
    {
        if( *str != '.' )
        {
            log_error("输入后缀 %s  有误 缺少符号\'.\' \n\n",str);
            return -1;
        }
    }
    else
    {
        log_error("输入后缀有误%s\n",str);
        return -1;
    }

    return 0;
}

/* ======================================================================================
* implementation
* 本模块对外函数位置
*/

/**
 * @brief 解析main函数参数将参数输入到input_param
 *
 * @param argc
 * @param argv
 * @param input_param
 * @return int
*/
int util_parse_input_param(int argc, char *argv[],input_param_t *input_param)
{
    int ret = 0;
    int i = 0;

    for ( i = 1; i < argc; i++)
    {
        if (strcmp(argv[i], "-v") == 0 && i + 1 < argc)
        {
            input_param->version = atoi(argv[i + 1]);
            i++;
        }
        else if (strcmp(argv[i], "-f") == 0 && i + 1 < argc)
        {

            if( _suffix_valid_check(argv[i + 1]) )
            {
                return -1;
            }

            strcpy(input_param->file_suffix, argv[i + 1]);
            i++;
        }
    }

    return 0;
}

/**
 * @brief 合并路径和文件名到string buffer
 * 
 * @param path 
 * @param file_name 
 * @param string 
 * @param string_size 
 * @return int 
 */
int util_merge_path_file_name(const char *path,const char *file_name,char *string,int string_size)
{
    char tmp_str[MAX_STR_LEN] = {0};
    if (string == NULL || string_size <= 0)
    {
        log_error("文件名缓存错误\n");
        return -1;
    }

    memset(string, 0, string_size);

    strcat(tmp_str,path);
    strcat(tmp_str,file_name);

    if( strlen(tmp_str) > string_size-1 )
    {
        log_error("%s 合并名过长 当前缓存%d 实际 %ld\n", tmp_str,string_size,strlen(tmp_str));
        return -1;
    }

    strcpy(string, tmp_str);

    return 0;
}

/**
 * @brief 替换字符串中的.为_
 *
 * @param str
 */
void util_replace_dot_with_underscore(char* str)
{
    if( str )
    {
        while (*str)
        {
            if (*str == '.')
            {
                *str = '_';
            }
            str++;
        }
    }

}

/**
 * @brief 删除文件名中的后缀
 *
 * @param str
 */
void delete_file_suffix(char* str)
{
    char *tmp = NULL;

    if ( str )
    {
        tmp = strrchr(str, '.');
        if( tmp )
        {
            while (*tmp)
            {
                *tmp = 0x00;
                tmp++;
            }
        }
    }
}

/**
 * @brief 合并路径和文件到file_path
 *
 * @param file_path
 * @param path
 * @param file
*/
void merge_full_file_path(char *file_path,int path_size,char *path,char *file)
{
    if(file_path == NULL)
    {
        return;
    }

    memset(file_path, 0x00, path_size);

    strcat(file_path,path);
    strcat(file_path,file);
}